815f151
@@ -1,5 +1,5 @@
 /*
- * Copyright 2002-2018 the original author or authors.
+ * Copyright 2002-2019 the original author or authors.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -54,6 +54,9 @@
final class ProfilesParser {
 	}
 
 	private static Profiles parseTokens(String expression, StringTokenizer tokens) {
+		return parseTokens(expression, tokens, Context.NONE);
+	}
+	private static Profiles parseTokens(String expression, StringTokenizer tokens, Context context) {
 		List<Profiles> elements = new ArrayList<>();
 		Operator operator = null;
 		while (tokens.hasMoreTokens()) {
@@ -63,7 +66,11 @@
final class ProfilesParser {
 			}
 			switch (token) {
 				case "(":
-					elements.add(parseTokens(expression, tokens));
+					Profiles contents = parseTokens(expression, tokens, Context.BRACKET);
+					if (context == Context.INVERT) {
+						return contents;
+					}
+					elements.add(contents);
 					break;
 				case "&":
 					assertWellFormed(expression, operator == null || operator == Operator.AND);
@@ -74,16 +81,23 @@
final class ProfilesParser {
 					operator = Operator.OR;
 					break;
 				case "!":
-					elements.add(not(parseTokens(expression, tokens)));
+					elements.add(not(parseTokens(expression, tokens, Context.INVERT)));
 					break;
 				case ")":
 					Profiles merged = merge(expression, elements, operator);
+					if (context == Context.BRACKET) {
+						return merged;
+					}
 					elements.clear();
 					elements.add(merged);
 					operator = null;
 					break;
 				default:
-					elements.add(equals(token));
+					Profiles value = equals(token);
+					if (context == Context.INVERT) {
+						return value;
+					}
+					elements.add(value);
 			}
 		}
 		return merge(expression, elements, operator);
@@ -126,6 +140,9 @@
final class ProfilesParser {
 	private enum Operator {AND, OR}
 
 
+	private enum Context {NONE, INVERT, BRACKET}
+
+
 	private static class ParsedProfiles implements Profiles {
 
 		private final String[] expressions;
